///\todo upgrade

//////////////////////////////////////////////////////////////////////////////////
//                                                                              //
//  This file is part of the buola project (https://code.google.com/p/buola/).  //
//                                                                              //
//  Copyright(c) 2007-2012 Xavi Gratal                                          //
//  gratal AT gmail DOT com                                                     //
//                                                                              //
//  Buola is free software: you can redistribute it and/or modify               //
//  it under the terms of the GNU General Public License as published by        //
//  the Free Software Foundation, either version 3 of the License, or           //
//  (at your option) any later version.                                         //
//                                                                              //
//  Buola is distributed in the hope that it will be useful,                    //
//  but WITHOUT ANY WARRANTY; without even the implied warranty of              //
//  MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the               //
//  GNU General Public License for more details.                                //
//                                                                              //
//  You should have received a copy of the GNU General Public License           //
//  along with buola.  If not, see <http://www.gnu.org/licenses/>.              //
//                                                                              //
//////////////////////////////////////////////////////////////////////////////////

#ifndef __BUOLA_PYTHON_CPYTHONBOX_H__
#define __BUOLA_PYTHON_CPYTHONBOX_H__

#include <buola/python.h>
#include <buola/python/types.h>

#include <buola/text.h>
#include <buola/text/cinteractivetextview.h>
#include <buola/gui/cmenu.h>

namespace buola { namespace python {

class CPythonBox : public gui::CWindow, public CInteractiveTextView::SCompleter
{
public:
    enum EPauseMode
    {
        PAUSE_WAIT,
        PAUSE_ENTER,
        PAUSE_CTRLC
    };

    CPythonBox();
    virtual ~CPythonBox();

    void SetStartupCommand(const std::wstring &pCommand);
    void WriteLine(const std::wstring &pString);
    void RunText(const std::wstring &pString,bool pEcho=true);

    void GetCompletionOptions(std::vector<std::wstring> &pList,
                CInteractiveTextView *pView,const std::wstring &pText);

    gui::PMenu GetMenu()    {   return mMenu;   }

    CInteractiveTextView *GetTextView()     {   return mView;   }

    static bool PauseUntilInput(EPauseMode pPauseMode=PAUSE_WAIT);

protected:
////////////// event handling //////////////
    void OnInteract(const std::wstring &pLine);
    void OnEnterNotInteracting();
    void OnCtrlC();
    void OnThreadFinished();

protected:
    gui::PMenu mMenu;
    gui::PToolBar mToolBar;
    CTextDoc *mDoc;
    CInteractiveTextView *mView;

    PyObject *mBuiltins;
    PyObject *mEval;
    YModule mCodeModule;
    YCallable mCompileCommand;

    std::wstring mPendingCommand;
    int mIndentLevel;

    bool mRunning;
    CThread *mRunningThread;
    gui::CAccelerator *mCtrlCAccel;

    std::wstring mStartupCommand;

public:
    static bool mInterrupted;
};

/*namespace python*/ } /*namespace buola*/ }

#endif
